Skip to content

fix(iac): refresh-outputs merges live Outputs (preserve fields not in Read response)#575

Merged
intel352 merged 2 commits into
mainfrom
fix/refresh-outputs-merge
May 7, 2026
Merged

fix(iac): refresh-outputs merges live Outputs (preserve fields not in Read response)#575
intel352 merged 2 commits into
mainfrom
fix/refresh-outputs-merge

Conversation

@intel352

@intel352 intel352 commented May 7, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Root cause: refreshOne replaced dst.Outputs entirely with live.Outputs from the cloud Read response. Cloud Read endpoints that don't return all create-time fields (e.g., DO Droplet user_data is write-only on Read) caused those fields to be silently zeroed in state.
  • Failure: After refresh-outputs, planner saw state.user_data="" vs config.user_data="<cloud-init>" → emitted REPLACE. Apply tried delete+create; Volume already attached → 422. This broke TC2 cutover run 25508442022.
  • Fix: Replace semantics → merge semantics. refreshOne starts from a clone of src.Outputs, overlays all live.Outputs keys (cloud truth wins for returned fields), and preserves fields absent from the Read response.

Changes

  • iac/refreshoutputs/refresh.go — merge logic replaces the single-line replace in refreshOne
  • iac/refreshoutputs/refresh_test.go — three new tests:
    • TestRefresh_MergePreservesFieldsNotInReaduser_data absent from Read response is preserved
    • TestRefresh_LiveOverridesExisting — cloud-returned value overrides stale state value
    • TestRefresh_NewFieldsFromLiveAdded — new fields from cloud Read are added to state
  • docs/adr/011-refresh-outputs-merge-semantics.md — records context, decision, and trade-offs

Trade-offs (per ADR 011)

If a cloud provider truly removes a field from a resource's outputs, refresh-outputs keeps the stale value. This is acceptable: cloud removals of IaC-managed output fields are rare, and the remediation (wfctl infra apply --refresh) is well-defined. The alternative (replace semantics) causes false REPLACE storms for write-only fields — a far more disruptive failure mode.

Test plan

  • go test ./iac/refreshoutputs/... — all 8 tests pass
  • go vet ./iac/refreshoutputs/... — clean
  • Three new tests cover the three regression scenarios

References

🤖 Generated with Claude Code

…fields

Replace semantics in refreshOne clobbered create-time fields absent from the
cloud Read response (e.g., DO Droplet user_data). After refresh, state held
user_data="" causing planner to emit a REPLACE, which hit a 422 when the
Volume was already attached (TC2 run 25508442022).

New merge semantics: start from src.Outputs clone, overlay live.Outputs keys,
so fields not returned by Read are preserved while cloud truth wins for fields
that are returned. Adds three new tests (MergePreservesFieldsNotInRead,
LiveOverridesExisting, NewFieldsFromLiveAdded) and ADR 011.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 7, 2026 16:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR changes iac/refreshoutputs to avoid clobbering persisted output fields that are not returned by a provider’s Read endpoint (e.g., write-only/create-time fields like DO Droplet user_data). It updates refresh behavior from “replace Outputs” to “merge Outputs”, adds regression tests for the intended merge semantics, and documents the decision in an ADR.

Changes:

  • Update refreshOne to merge live.Outputs into a clone of src.Outputs, preserving fields absent from Read.
  • Add tests covering: preserve absent fields, live overrides stale values, and new live fields get added.
  • Add ADR 011 documenting merge semantics and trade-offs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
iac/refreshoutputs/refresh.go Implements merge semantics when reconciling dst.Outputs from provider Read results.
iac/refreshoutputs/refresh_test.go Adds tests validating merge behavior across preserve/override/add scenarios.
docs/adr/011-refresh-outputs-merge-semantics.md Documents rationale, decision, and trade-offs for merge semantics.

Comment thread iac/refreshoutputs/refresh.go Outdated
needsUpdate := false
merged := cloneMap(src.Outputs)
for k, v := range live.Outputs {
if existing, ok := merged[k]; !ok || !reflect.DeepEqual(existing, v) {
Comment thread iac/refreshoutputs/refresh.go Outdated
Comment on lines +115 to +119
merged := cloneMap(src.Outputs)
for k, v := range live.Outputs {
if existing, ok := merged[k]; !ok || !reflect.DeepEqual(existing, v) {
merged[k] = v
needsUpdate = true
Comment on lines +221 to +236
func TestRefresh_MergePreservesFieldsNotInRead(t *testing.T) {
states := []interfaces.ResourceState{
{
Name: "coredump-staging-droplet",
Type: "infra.droplet",
ProviderID: "droplet-1",
// user_data was captured at create-time; Read won't return it.
Outputs: map[string]any{"id": "x", "user_data": "<script>init</script>"},
},
}
fakeProvider := &fakeIaCProvider{readOutputs: map[string]map[string]any{
// provider Read only returns id — user_data is omitted (write-only on Read)
"droplet-1": {"id": "x"},
}}

refreshed, err := Refresh(context.Background(), fakeProvider, states, Options{Concurrency: 1})
Address Copilot review findings:
- nil src.Outputs + non-empty live.Outputs panicked on map assignment.
  Switch to copy-on-write: allocate the merged map only on first detected
  difference, seeding it with maps.Copy(merged, src.Outputs) which is
  nil-safe (copies nothing from nil).
- Remove per-resource unconditional clone (now only allocated when a change
  is detected).
- Remove the now-unused cloneMap helper.
- Add TestRefresh_NilSrcOutputs_LiveFieldsPopulated (would have caught the
  nil-map panic).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:260: parsing iteration count: invalid syntax
baseline-bench.txt:298233: parsing iteration count: invalid syntax
baseline-bench.txt:613426: parsing iteration count: invalid syntax
baseline-bench.txt:918347: parsing iteration count: invalid syntax
baseline-bench.txt:1236309: parsing iteration count: invalid syntax
baseline-bench.txt:1519108: parsing iteration count: invalid syntax
benchmark-results.txt:260: parsing iteration count: invalid syntax
benchmark-results.txt:342153: parsing iteration count: invalid syntax
benchmark-results.txt:671392: parsing iteration count: invalid syntax
benchmark-results.txt:989579: parsing iteration count: invalid syntax
benchmark-results.txt:1311405: parsing iteration count: invalid syntax
benchmark-results.txt:1651498: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4               6.712m ± 68%
ComponentLoad-4                     3.618m ±  1%
ComponentExecute-4                  1.938µ ±  0%
PoolContention/workers-1-4          1.093µ ±  1%
PoolContention/workers-2-4          1.093µ ±  3%
PoolContention/workers-4-4          1.089µ ±  1%
PoolContention/workers-8-4          1.098µ ±  1%
PoolContention/workers-16-4         1.098µ ±  5%
ComponentLifecycle-4                3.804m ±  1%
SourceValidation-4                  2.410µ ±  2%
RegistryConcurrent-4                911.1n ±  5%
LoaderLoadFromString-4              3.845m ±  2%
geomean                             19.11µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  6.373m ± 70%
ComponentLoad-4                        3.508m ±  8%
ComponentExecute-4                     1.821µ ±  1%
PoolContention/workers-1-4             1.018µ ±  1%
PoolContention/workers-2-4             1.016µ ±  3%
PoolContention/workers-4-4             1.023µ ±  1%
PoolContention/workers-8-4             1.025µ ±  3%
PoolContention/workers-16-4            1.024µ ±  2%
ComponentLifecycle-4                   3.528m ±  0%
SourceValidation-4                     2.095µ ±  1%
RegistryConcurrent-4                   740.6n ±  2%
LoaderLoadFromString-4                 3.586m ±  1%
geomean                                17.61µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  297.7n ± 7%
CircuitBreakerExecution_Success-4          21.54n ± 0%
CircuitBreakerExecution_Failure-4          66.01n ± 1%
geomean                                    75.08n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                    304.6n ± 11%
CircuitBreakerExecution_Success-4            22.66n ±  0%
CircuitBreakerExecution_Failure-4            70.92n ±  0%
geomean                                      78.81n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
JQTransform_Simple-4                     894.8n ± 29%
JQTransform_ObjectConstruction-4         1.486µ ±  1%
JQTransform_ArraySelect-4                3.429µ ±  2%
JQTransform_Complex-4                    39.69µ ±  2%
JQTransform_Throughput-4                 1.794µ ±  0%
SSEPublishDelivery-4                     70.29n ±  1%
geomean                                  1.684µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.22Ki ± 0%
JQTransform_Throughput-4               1.984Ki ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    324.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
JQTransform_Simple-4                        826.1n ± 32%
JQTransform_ObjectConstruction-4            1.422µ ± 27%
JQTransform_ArraySelect-4                   3.492µ ±  2%
JQTransform_Complex-4                       41.94µ ±  0%
JQTransform_Throughput-4                    1.737µ ±  0%
SSEPublishDelivery-4                        63.68n ±  1%
geomean                                     1.634µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.22Ki ± 0%
JQTransform_Throughput-4                  1.984Ki ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       324.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.114µ ± 17%
SchemaValidation_AllFields-4                1.665µ ±  7%
SchemaValidation_FormatValidation-4         1.582µ ±  4%
SchemaValidation_ManySchemas-4              1.839µ ±  3%
geomean                                     1.524µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.130µ ± 12%
SchemaValidation_AllFields-4                   1.655µ ±  1%
SchemaValidation_FormatValidation-4            1.594µ ±  5%
SchemaValidation_ManySchemas-4                 1.617µ ±  2%
geomean                                        1.482µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.192µ ± 27%
EventStoreAppend_SQLite-4                  1.317m ±  6%
GetTimeline_InMemory/events-10-4           13.47µ ±  2%
GetTimeline_InMemory/events-50-4           74.91µ ± 19%
GetTimeline_InMemory/events-100-4          120.5µ ±  0%
GetTimeline_InMemory/events-500-4          618.9µ ±  1%
GetTimeline_InMemory/events-1000-4         1.267m ±  1%
GetTimeline_SQLite/events-10-4             106.0µ ±  1%
GetTimeline_SQLite/events-50-4             244.4µ ±  1%
GetTimeline_SQLite/events-100-4            414.8µ ±  2%
GetTimeline_SQLite/events-500-4            1.755m ±  0%
GetTimeline_SQLite/events-1000-4           3.413m ±  1%
geomean                                    214.8µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  794.5 ± 8%
EventStoreAppend_SQLite-4                  1.984Ki ± 2%
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%
geomean                                    67.37Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.086µ ± 14%
EventStoreAppend_SQLite-4                     1.044m ±  4%
GetTimeline_InMemory/events-10-4              12.89µ ±  1%
GetTimeline_InMemory/events-50-4              71.64µ ± 24%
GetTimeline_InMemory/events-100-4             110.6µ ±  2%
GetTimeline_InMemory/events-500-4             568.4µ ±  1%
GetTimeline_InMemory/events-1000-4            1.168m ±  2%
GetTimeline_SQLite/events-10-4                88.77µ ±  1%
GetTimeline_SQLite/events-50-4                233.9µ ±  1%
GetTimeline_SQLite/events-100-4               406.5µ ±  1%
GetTimeline_SQLite/events-500-4               1.760m ±  2%
GetTimeline_SQLite/events-1000-4              3.433m ±  1%
geomean                                       199.3µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     765.0 ± 5%
EventStoreAppend_SQLite-4                     1.984Ki ± 1%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.16Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@intel352 intel352 merged commit 82bc25a into main May 7, 2026
23 checks passed
@intel352 intel352 deleted the fix/refresh-outputs-merge branch May 7, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants